home *** CD-ROM | disk | FTP | other *** search
- /* $VER: ScanTeXErrors.ged V 0.8 © 1994 Fin Schuppenhauer */
- /**
- Lädt das Logfile zum aktuellen Text und zeigt alle Fehler der
- Reihe nach an. Fehler, die nicht zum aktuellen Quelltext ge-
- hören werden erkannt und bei bedarf wird die zugehörige Datei
- nachgeladen.
- Der Cursor wird auf der fehlerhaften Zeile positioniert und
- die Fehlermeldung in einem Requester ausgegeben.
- Nachdem das Logfile der Hauptdatei einmal geladen wurde, kann
- auch von allen anderen Fenstern, die (La)TeX-Quelltext ent-
- halten, der von der Hauptdatei nachgeladen wurde, dieses
- Makro aufgerufen werden.
- Wenn der/die Texte neu übersetzt wurden, müssen die hier ggf.
- erzeugten Clip-Variablen gelöscht und das Logfile-Fenster ge-
- schlossen werden.
- Dies erledigt das Makro "ResetTeXError.ged".
-
- Dieses Makro ist PUBLIC DOMAIN.
-
- Für Fehlerberichte, Anregungen, Wünsche, Geschenke, Lob,
- Kritik, Teddybären, CDs, Disketten, Cassetten, Videofilme,
- nützliche Programme und Utilities, spaßige Makros, geniale
- Sytle-Files, Postkarten, Kuchen, Kekse, Bücher über ARexx,
- Bücher allgemein, Bücher speziell, Briefmarken, Fotos,
- Reisegutscheine, Einladungen, Freiflugtickets, Schokoloade
- (weiß oder mit Trauben bevorzugt), nette E-Mails, nette
- handgeschriebene Briefe, Festplatten (sowohl welche für
- den Rechner als auch für Feten/Feste), Schallplatten, Tief-
- kühlkostgerichte, Äpfel, Birnen und Banannen, Hägen-Daz-Eis,
- Icestelli-Eis (Mmm, auf den Becher, lecker, lecker und
- lecker!), ...
- bin ich jederzeit dankbar und können an folgende Adresse
- gesendet werden:
-
- Fin Schuppenhauer
- Barußpark 10
- 20537 Hamburg
- (Germany)
-
- Oder für die E-Mail-Freaks:
-
- schuppen@rzdspc2.informatik.uni-hamburg.de
-
- **/
-
- OPTIONS RESULTS /* enable return codes */
-
- if (LEFT(ADDRESS(), 6) ~= "GOLDED") then /* not started by GoldEd ? */
- address 'GOLDED.1'
-
- 'LOCK CURRENT' /* lock GUI, gain access */
- OPTIONS FAILAT 6 /* ignore warnings */
- SIGNAL ON SYNTAX /* ensure clean exit */
-
-
- /* ------------------------ INSERT YOUR CODE HERE: ------------------- */
-
- 'QUERY CAT'
- isGerman = (result = "deutsch")
-
- /* RexxSupport.library öffnen: */
- if ~show('L', "rexxsupport.library") then do
- if ~addlib('rexxsupport.library',0,-30,0) then do
- if (isGerman) then
- 'REQUEST BODY="rexxsupport.library kann nicht geöffnet werden!" BUTTON="So''n Mist"'
- else
- 'REQUEST BODY="Unable to open rexxsupport.library!" BUTTON="That''s bad!'
- 'UNLOCK'
- EXIT
- end
- end
-
- 'QUERY DOC VAR DOCNAME'
- logname = left(docname, length(docname)-3) || log
- lp = 0
- lp = lastpos('/', docname)
- if lp = 0 then
- lp = lastpos(':', docname)
- filename = right(docname, length(docname)-lp)
-
- /* Haben wir auch einen (La)TeX-Quelltext im aktuellen Fenster? Dann */
- /* muß er ja auf .tex oder .sty enden: */
- if (right(docname,4) ~= '.tex') & (right(docname,4) ~= '.sty') then do
- if (isGerman) then
- 'REQUEST BODY="Dies ist kein (La)TeX-Quelltext." BUTTON=Ok'
- else
- 'REQUEST BODY="This is no (La)TeX source." BUTTON=Ok'
- 'UNLOCK'
- EXIT
- end
-
- if ~show('C', 'texfiles') then do
- /* Das kann nur bedeuten, daß es noch kein Logfile geladen wurde: */
- if exists(logname) then do
- /* Logfile existiert: Ist es auch älter als das .tex/.sty-File?: */
- docinfo = statef(docname)
- loginfo = statef(logname)
- docdays = subword(docinfo,5,1)
- docmins = subword(docinfo,6,1)
- doctick = subword(docinfo,7,1)
- logdays = subword(loginfo,5,1)
- logmins = subword(loginfo,6,1)
- logtick = subword(loginfo,7,1)
- if (doctick > logtick) & (docmins >= logmins) & (docdays >= logdays) then do
- if (isGerman) then
- 'REQUEST BODY="Logfile ist älter als aktueller Text!|Bitte erst neu übersetzen." BUTTON=Ok'
- else
- 'REQUEST BODY="Logfile is older then current text!|Please, compile first." BUTTON=Ok'
- 'UNLOCK'
- EXIT
- end
- 'UNLOCK'
- /* Jetzt schalten wir um auf das Fenster mit unserem .log-File. */
- /* Sollte es ein deartiges Fenster nicht geben, sorgt dir Option */
- /* FORCE dafür, daß das Logfile gleich geladen wird. */
- /* Läßt es sich eigentlich verhindern, daß das neugeladene Fenster*/
- /* nach vorne geholt und aktiviert wird? */
- 'WINDOW USE='logname' FORCE QUIET'
- 'LOCK NAME='logname' QUIET'
-
- /* Nun durchsuchen wir den Text nach dazugeladenen .tex-Dateien */
- /* und merken uns deren Namen, sowie den Zeilenbereich, den sie */
- /* beanspruchen (das hilft uns unten bei der Überprüfung, ob der */
- /* nächste gefundene Fehler auch zum aktuellen Quelltext gehört): */
- texfile = logname
- /* Das Hauptfile taucht zweimal auf (1. in der Parameterübergabe */
- /* zum TeX-Aufruf; 2. die Information daß das Hauptfile dazuge- */
- /* laden wurde. Danach können wir die Suche beginnen): */
- 'FIND STRING='filename' FIRST'
- 'FIND STRING=.tex NEXT'
- done = 0
- do until done ~= 0
- 'FIND STRING=.tex NEXT QUIET'
- if rc = 0 then do
- 'PING 1'
- 'PREV'
- 'QUERY WORD VAR WORT'
- texfile = texfile' 'wort || '.tex'
- /* Jetzt bestimmen wir den Zeilenbereich, denn diese */
- /* Datei im Logfile beansprucht: */
- 'FIND STRING=( PREV'
- 'QUERY ABSLINE VAR STARTLINE'
- 'PING 0'
- ddone = 0
- do until ddone ~= 0
- 'BRACKET MATCH'
- if rc = 0 then
- ddone = 1
- else do
- /* Keine passende schließende Klammer gefunden. */
- /* Dies kann passieren, wenn der Übersetzungsvor- */
- /* gang vorzeitig mit x unterbrochen wurde. */
- 'GOTO BOTTOM'
- 'GOTO EOL STEP 1'
- 'TEXT T=)'
- 'PONG 0'
- end
- end
- 'QUERY ABSLINE VAR ENDLINE'
- /* Die geholten Daten sichern: */
- clipvalue = startline' 'endline
- call setclip(wort'.tex', clipvalue)
- /* Zurück zu der Stelle, wo wir .tex gefunden haben: */
- 'PONG 1'
- end
- else
- /* Keine weitere .tex-Datei gefunden. */
- done = 1
- end
- call setclip('texfiles', texfile)
- call setclip('scanline', '1')
- end
- else do
- if (isGerman) then
- 'REQUEST BODY="Logfile nicht gefunden!" BUTTON=Ok'
- else
- 'REQUEST BODY="Logfile not found!" BUTTON = Ok'
- 'UNLOCK'
- EXIT
- end
- end
- /* Es gibt im Clip einen Eintrag texfiles, d.h. das Logfile wurde */
- /* bereits geladen. */
- else do
- /* Ist unsere akt. Datei auch darin enthalten, d.h. gibt es */
- /* im Clip einen Eintrag, der unserem Filenamen entspricht? */
- texfiles = getclip('texfiles')
- clipvalue = getclip(filename)
- if rc ~= 0 then do
- if (isGerman) then
- 'REQUEST BODY="Kein Hinweis auf diese Datei|im geladenen Logfile!" BUTTON=Ok'
- else
- 'REQUEST BODY="No information for this file|in loaded logfile!" BUTTON="I see"'
- 'UNLOCK'
- EXIT
- end
- logwindow = subword(texfiles, 1, 1)
- 'UNLOCK'
- /* FORCE, falls das Fenster zwischenzeitlich geschlossen wurde: */
- 'WINDOW USE='logwindow' FORCE QUIET'
- 'LOCK NAME='logwindow' QUIET'
- end
-
- /* Hier beginnt nun endlich die Fehlersuche: */
- scanline = getclip('scanline')
- done = 0
- 'GOTO LINE='scanline
- do until done ~= 0
- 'FIND STRING=l. NEXT QUIET'
- if rc = 0 then do
- 'QUERY COLUMN VAR CURRCOL'
- if currcol <= 2 then do
- 'NEXT'
- 'QUERY WORD VAR ERRORLINE'
- 'QUERY ABSLINE VAR SCANLINE'
- call setclip('scanline', scanline)
- line = errorline
- ddone = 0
- do until ddone ~= 0
- 'FIND STRING=! PREV'
- 'QUERY COLUMN VAR CURRCOL'
- if currcol = 1 then
- ddone = 1
- end
- 'QUERY BUFFER VAR CURRBUF'
- currbuf = delword(currbuf, 1, 1)
- done = 1
- end
- end
- else do
- /* Keinen weiteren Fehler gefunden: */
- line = 0
- done = 1
- end
- end
-
- if line ~= 0 then do
- done = 0
- do until done ~= 0
- 'FIND STRING=.tex PREV'
- 'PREV'
- 'QUERY WORD VAR WORT'
- if scanline <= word(getclip(wort'.tex'),2) then do
- 'QUERY BUFFER VAR FNBUF'
- lp = lastpos('.tex', fnbuf)
- fnbuf = delstr(fnbuf, lp+4)
- lp = lastpos('(', fnbuf)
- fnbuf = right(fnbuf, length(fnbuf)-lp)
- done = 1
- end
- end
-
- lp = 0
- lp = lastpos('/', fnbuf)
- if lp = 0 then
- lp = lastpos(':', fnbuf)
- fname = right(fnbuf, length(fnbuf)-lp)
-
- /* Zugehöriges Fenster suchen */
- 'QUERY WINDOWS VAR WINS'
- done = 0
- do i=0 to wins-1 while done = 0
- 'UNLOCK'
- 'WINDOW ORDINAL='i' QUIET'
- 'LOCK CURRENT'
- 'QUERY DOC VAR WINNAME'
- if lastpos(fname, winname) ~= 0 then do
- 'WINDOW ORDINAL='i
- done = 1
- end
- end
- if done = 0 then do
- 'WINDOW USE='fnbuf' FORCE QUIET'
- 'QUERY WINDOWS VAR WINS'
- wins = wins - 1
- 'UNLOCK'
- 'WINDOW ORDINAL='wins
- 'LOCK CURRENT'
- end
-
- 'GOTO LINE='errorline
- if (isGerman) then
- 'REQUEST BODY="Fehler in Zeile 'errorline':|'currbuf'" BUTTON=Ok'
- else
- 'REQUEST BODY="Error in line 'errorline':|'currbuf'" BUTTON=Ok.'
- end
- else do
- 'UNLOCK'
- 'LOCK NAME='docname
- if (isGerman) then
- 'REQUEST BODY="Kein weitere Fehler." BUTTON=Prima'
- else
- 'REQUEST BODY="No more errors." BUTTON=Good'
- end
-
- /* ---------------------------- END OF YOUR CODE --------------------- */
-
- 'UNLOCK' /* VERY important: unlock GUI */
- EXIT
-
- SYNTAX:
-
- SAY "Sorry, error line" SIGL ":" ERRORTEXT(RC) ":-("
- 'UNLOCK'
- EXIT
-